#!/usr/bin/python3
# -*- coding: utf-8 -*-


class Credential(object):
    """ 身份凭据
    """
    __slots__ = ('__username',)

    def __init__(
            self,
            username: str
    ):
        """ 构造身份凭据。

        :param username: 身份凭据表示的帐户名。
        """
        username = username.strip() if username else ''
        assert username

        self.__username = username

    @property
    def username(self):
        """ 获取帐户名。
        """
        return self.__username


class PasswordCredential(Credential):
    """ 使用口令验证的身份凭据。
    """
    __slots__ = ('__password',)

    def __init__(self,
                 username: str,
                 password: str
                 ):
        """ 构造使用口令验证的身份凭据。

        :param username:  身份凭据表示的帐户名。
        :param password: 用于验证身份的口令。
        """
        super().__init__(username)

        password = password.strip() if password else ''
        assert password

        self.__password = password

    @property
    def password(self):
        """ 获取口令。
        """
        return self.__password

    def __str__(self):
        return 'password-credential[{username}/******]'.format(username=self.username)

    def __repr__(self):
        return 'PasswordCredential(username={username}, password={password})' \
            .format(username=repr(self.username), password=repr(self.password))


class KeyPairCredential(Credential):
    """ 使用密钥对验证的身份凭据。
    """
    __slots__ = ('__pkey',)

    def __init__(self,
                 username: str,
                 pkey
                 ):
        """ 构造使用密钥对验证的身份凭据。

        :param username: 身份凭据表示的帐户名。
        :param pkey: 用于验证身份的密钥。
        """
        super().__init__(username)

        assert pkey

        self.__pkey = pkey

    @property
    def pkey(self):
        """ 获取密钥。
        """
        return self.__pkey

    def __repr__(self):
        return 'KeyPairCredential(username={username}, pkey={pkey})' \
            .format(username=repr(self.username), pkey=repr(self.pkey))
